perm filename IMPINT.MAC[IP,SYS] blob sn#704040 filedate 1983-03-08 generic text, type T, neo UTF8
TITLE IMPINT	HARDWARE/SOFTWARE INTERFACE	V 1515/515		
SUBTTL SUNDBERG/RLS/EAT --	22-APR-73
	SEARCH	F,S		;MACRO V50
	$RELOC
	$LOW
	XP VIMPNT,516	;5.06 VERSION = 1000+5.04 VERSION

;LOCAL REVISION HISTORY

;[96bit]	7-Jul-80, Jim McCool
;	Modules effected: S, COMDEV, I, IMPINT, IMPSER, NETCON
;	Edit type: Enhancement
;	Add the CMU modifications to the ARPAnet code to support
;	96 bit leaders in the HOST-IMP protocol


;END OF LOCAL REVISION HISTORY

	ENTRY IMPINT
IMPINT::


;     BECAUSE OF ASSEBLY-TIME ERROR IN COMMON (MACRO BUG), ALL MPO...
;     VALUES AND LABELS HAVE BEEN CHANGED TO MPP...		DK/FEB 75



COMMENT \
	INPUT INTERRUPT CHANNEL MUST BE HIGHER PRIORITY THAN
END-OF-MESSAGE CHANNEL
\

SUBTTL DOCUMENTATION

COMMENT \

	INTERNAL ROUTINES:

IMPDWN--	TURNS THE HARDWARE OFF AND SETS PDP10 DOWN BIT

IMPIOF--	TURNS OFF INPUT

IMPION--	TURNS ON INPUT

IMPCHK--	CHECKS THE STATUS OF THE HARDWARE.  THE RETURN ADDRESS
		DEPENDS ON THE STATUS.  NO SKIP MEANS THAT THE IMP
		IS DEAD.  ONE SKIP MEANS THAT IT WAS DEAD BUT IS
		APPARENTLY OK NOW.  A DOUBLE SKIP MEANS THAT THE
		PDP-10 IS QUESTIONABLE.  A TRIPLE SKIP MEANS THAT ALL
		IS OK.

IMPOUT--	ROUTINE TO START UP THE OUTPUT SECTION.  T1 MUST
		CONTAIN AN IOWD POINTER TO AN OUTPUT MESSAGE.  RETURNS
		IMMEDIATELY IF THE HARDWARE IS BUSY AND THE MESSAGE
		CANNOT BE TRANSMITTED.  THE SKIP RETURN IS TAKEN
		IF THE MESSAGE IS BEING TRANSMITTED.
	EXTERNAL ROUTINES:

IMPEOM--	CALLED WHEN END-OF-MESSAGE HAS BEEN TRANSMITTED.
		IF THERE IS NO MORE OUTPUT, RETURN WITH A POPJ P,.
		IF ANOTHER MESSAGE IS TO BE TRANSMITTED, PLACE THE IOWD
		POINTER IN T1 AND TAKE THE SKIP RETURN.

IMPOND--	CALLED UPON A RUNOUT OF THE BLKO POINTER.  TO APPEND
		MORE OUTPUT, RETURN A NEW IOWD POINTER IN T1.  OTHER-
		WISE, DO NOT ALTER T1.

IMPIN--		CALLED ON THE FIRST WORD OF AN INCOMING MULTIWORD
		MESSAGE.  T1 CONTAINS THE FIRST WORD.  RETURN WITH
		A POPJ P, AND T1 LOADED AS FOLLOWS:
		IF THE ENTIRE MESSAGE IS TO BE INPUT, T1 SHOULD
			CONTAIN A LEGAL IOWD POINTER.
		IF THE MESSAGE IS TO BE IGNORED, T1 SHOULD CONTAIN
			ANY POSITIVE NUMBER.
		IF IT IS DESIRED THAT IMPIN(OR IMPONE, BELOW) BE
			CALLED ON THE NEXT INPUT WORD, T1 SHOULD
			BE ZEROED.

IMPEIM--	CALLED WHEN AN END-OF-MESSAGE HAS BEEN RECEIVED.  T1
		CONTAINS THE CURRENT BLKI POINTER.
		RETURNS NON-SKIP ALWAYS.

IMPIND--	CALLED WHEN A SUPPLIED INPUT IOWD POINTER RUNS OUT.
		THE OLD POINTER(EXPIRED) IS IN T1 (SEE IMPEIM).  RETURN WITH
		A POPJ P, WITH T1 LOADED AS IN IMPIN, ABOVE.
\
SUBTTL PARAMETERS


;HARDWARE DEFINITIONS

IMP==	   550	;IMP DEVICE NUMBER

;CONI BITS
POWER==	200000	;IMP INTERFACE TURNED ON
DOWN10==100000	;PDP-10 WAS DOWN
SICK==   40000	;IMP WAS DOWN
DEAD==   20000	;IMP CURRENTLY DOWN
ENDIN==	  4000	;EOM RECEIVED
EMPTY==	   200	;OUTPUT BUFFER EMPTY
FULL==	    10	;INPUT BUFFER FULL

;CONO BITS
CSICK== 200000	;CLEAR SICK FLAG
DOWN10==100000	;PDP-10 IS UNHEALTHY
OUTSTP== 40000	;CLEAR EMPTY FLAG
OUTEND== 20000	;SEND EOM
GOTEND== 10000	;ACKNOWLEDGE INPUT EOM
MPEENB==  4000	;ENABLE PI FIELD FOR ENDIN INTERRUPT
MPPENB==   200	;ENABLE PI FIELD FOR OUTPUT INTERRUPT
MPIENB==    10	;ENABLE PI FIELD FOR INPUT INTERRUPT

ALLENB==MPIENB+MPPENB+MPEENB

MPISET==MPIENB+MPIPI##		;SETS THE INPUT CHANNEL
MPESET==MPEENB+MPEPI##		;SETS E-O-M CHANNEL
MPPSET==MPPENB+MPPPI##		;OUTPUT CHANNEL


;MACRO TO DISMISS INTERRUPTS IN VARIOUS WAYS

DEFINE JMPENB(CH) <
	  JEN	@CH'CHL##
>
	SUBTTL INTERRUPT CODE

;MPI INTERRUPT SERVICE --  INPUT FROM IMP


MPIINT::CONSO	IMP,FULL	;IMP INPUT?
	JRST	.-1
MPIIN1:	SKIPL	BLKIPT		;GOOD BLKI?
	JRST	ONEWRD		;NO
	BLKI	IMP,BLKIPT	;READ
	SKIPA
	JMPENB	(MPI)		;DISMISS
	JSR	MPISAV##	;COUNTED OUT
	MOVE	T1,BLKIPT
	CONSZ	IMP,ENDIN	;WAS IT THE LAST ANYWAY?
	JRST	END2		;YES
	PUSHJ	P,IMPIND##	;NO.  TELL OF RUNOUT
	JRST	MPIIN2		;STORE NEW POINTER AND RESUME INPUT

;EITHER FIRST INPUT OR THROWING AWAY DATA
ONEWRD:
	conso	imp,endin	;[96bit] EOM already on? (1 word long)
	SKIPE	BLKIPT		;FIRST?
	JRST	IGNORE		;NO
;[96bit] no one word messages.
;[96bit]CONSZ	IMP,ENDIN	;EOM SEEN?  (MUST TEST BEFORE DATAI)
;[96bit]JRST	ONEIN		;YES
	JSR	MPISAV##
	DATAI	IMP,T1		;GET LEADER
	PUSHJ	P,IMPIN##	;EXCHANGE FOR BLKI POINTER
MPIIN2:	MOVEM	T1,BLKIPT
;[96bit] nobody ever uses this information.
;[96bit]SETZM	OVERFL		;CLEAR OVERFLOW COUNTER
;[96bit]SKIPLE	T1		;DISCARDING NEXT INPUT?
;[96bit]AOS	OVERFL		;YES, START COUNT
	POPJ	P,

IGNORE:	DATAI	IMP,DUMMY	;THROW AWAY OVERFLOW DATA
	JMPENB	(MPI)		;DISMISS
;MPE INTERRUPT SERVICE  --  END-OF-MESSAGE

MPEINT::CONSO	IMP,ENDIN	;IMP END OF INPUT?
	JRST	.-1
	CONSZ	IMP,FULL	;YES, DID INPUT FLAG COME UP JUST NOW?
	JRST	MPIIN1		;YES, HANDLE IT FIRST
	JSR	MPESAV##
;[96bit]SKIPL	T1,BLKIPT	;UNDERFLOW?
;[96bit]HRL	T1,OVERFL	;NO.  PERHAPS OVERFLOW
	skipge	t1,blkipt	;[96bit] load t1, skip if ingoring input
END2:	PUSHJ	P,IMPEIM##	;TELL IMP SERVICE
	SETZM	BLKIPT		;READY FOR NEXT INPUT MESSAGE
;[96bit]SETZM	OVERFL
END3:	CONO	IMP,GOTEND	;RESUME INPUT
	POPJ	P,

;[96bit] imp-host messages no longer fit in one word: handle
;	 like buffered input.
;ONEIN:	DATAI	IMP,T1		;GET LEADER
;[96bit]PUSHJ	P,IMPONE##	;SEND MESSAGE TO IMPSER
;[96bit]JRST	END3
;MPP INTERRUPT SERVICE -- OUTPUT TO IMP

MPPINT::CONSO	IMP,EMPTY	;IMP OUTPUT?
	JRST	.-1
	SKIPL	BLKOPT		;LEGIT IOWD?
	JRST	DONE		;NO
	BLKO	IMP,BLKOPT	;YES
	JRST	.+2		;BLKO RUNOUT
	JMPENB	(MPP)		;DISMISS
	JSR	MPPSAV##
	MOVE	T1,BLKOPT
	PUSHJ	P,IMPOND##	;RETURN ANOTHER BLKO POINTER
	MOVEM	T1,BLKOPT
	POPJ	P,		;DISMISS INTERRUPT

DONE:	SKIPG	BLKOPT		;CLEARED?
	JRST	NONE		;YES
	JSR	MPPSAV##	;NO
	CONO	IMP,OUTEND	;SEND EOM
	PUSHJ	P,IMPEOM##	;TELL IMP SERVICE
	  SETZ	T1,		;QUEUES ARE EMPTY
	MOVEM	T1,BLKOPT
	POPJ	P,		;DISMISS

NONE:	SETZM	OUTACT		;SET INACTIVE
	CONO	IMP,OUTSTP	;STOP HARDWARE
	JMPENB	(MPP)		;DISMISS


;LEGAL FLAG STATES:

;BLKOPT:	 -,	 +,	 0,	 0
;OUTACT:	-1,	-1,	-1,	 0
;STATE NUMBER:	 1,	 2,	 3,	 4 

;	1.	NORMAL TRANSMISSION IN PROGRESS.  OUTPUT REQUESTS
;		MUST BE QUEUED.
;	2.	OUTPUT BLOCK DONE.  EOM ON NEXT INTERRUPT.  OUTPUT
;		REQUESTS MUST BE QUEUED.
;	3.	STOPPING.  QUEUES WERE EMPTY.  OUTPUT REQUEST MAY
;		BE DEPOSITED DIRECTLY IN BLKOPT.
;	4.	INACTIVE.  HARDWARE MUST BE RESTARTED ON OUTPUT
;		REQUESTS.
SUBTTL SUBROUTINES

;HERE TO OUTPUT A BLOCK TO THE IMP
;INTERRUPTS MUST BE DISABLED
;CALL:
;	MOVE T1,[IOWD LENGTH,ADDRESS]
;	PUSHJ P,IMPOUT
;	RETURN HERE IF MUST QUEUE
;	HERE IF OUTPUT STARTED

IMPOUT::consz	pi,impbts##	;(debug) are the IMPs enabled?
	 stopcd	.+1,DEBUG,IDE	;(debug) imps dangerously enabled.
	SKIPE	BLKOPT		; ALREADY OUTPUTTING?
	POPJ	P,		;YES.
	JUMPGE	T1,CPOPJ1##	;PRETEND OK IF NOTHING THERE
	SKIPE	OUTACT		;ACTIVE?
	JRST	IMPOU2		;YES, JUST STORE NEW BLKOPT
	SETOM	OUTACT		;FLAG ACTIVE
	blko	imp,t1		;[96bit] output the first word
	  jrst	cpopj1		;[96bit] should never be here, ever.
IMPOU1:	CONO	IMP,MPPSET	;ENABLE OUTPUT HARDWARE
IMPOU2:	MOVEM	T1,BLKOPT	;STORE NEW IOWD
	JRST	CPOPJ1		;SKIP RETURN
;CODE TO CHECK HARDWARE HEALTH

;CALL:
;	PUSHJ	P,IMPCHK
;	  ERROR RETURN	...  IMP OR INTERFACE DOWN
;	  ERROR RETURN	...  IMP OR INTERFACE WAS DOWN
;	OK RETURN

IMPCHK::MOVEI	T4,EMPTY	;ENABLE OUTPUT FLAG TEST
	HRRM	T4,MPPINT
	CONO	IMP,MPPSET	;MAKE SURE OUTPUT ON
	SKIPE	INPON		;WANT INPUT OPEN?
	PUSHJ	P,IMPION	;YES, MAKE SURE TURNED ON
	CONSO	IMP,POWER	;POWER DOWN?
	POPJ	P,		;YES
	CONSO	IMP,SICK	;INTERFACE ERROR?
	JRST	CPOPJ2##	;NO, DOUBLE SKIP
	CONSZ	IMP,DEAD	;IS IT STILL DOWN?
	POPJ	P,		;YES
	CONO	IMP,CSICK	;CLEAR FAULT
	JRST	CPOPJ1		;AND TAKE SINGLE SKIP
;INITIALIZE DEVICES

;SUBROUTINE TO TURN THE HARDWARE OFF
IMPDWN::CONO	IMP,DOWN10+ALLENB;TURN OFF HARDWARE
	HLLZS	MPPINT		;DISABLE OUTPUT FLAG TEST IN SKIP CHAIN
	SETZM	OUTACT
	SETZM	BLKIPT
	SETZM	BLKOPT

;HERE TO TURN OFF INPUT
IMPIOF::SETZM	INPON		;TURN OFF INPUT ACTIVE FLAG
	CONO	IMP,MPIENB!MPEENB	;TURN OFF INPUT
	HLLZS	MPIINT		;DISABLE INPUT FLAG TESTS
	HLLZS	MPEINT
	POPJ	P,

;HERE TO TURN INPUT ON
IMPION::SETOM	INPON		;TURN ON FLAG FOR CLOCK
	push	p,t1		; save a scratch
	MOVEI	t1,FULL		;ENABLE INTERRUPT FLAG TESTS
	HRRM	t1,MPIINT
	MOVEI	t1,ENDIN
	HRRM	t1,MPEINT
	pop	p,t1		; restore scratch reg.
	CONO	IMP,MPISET	;TURN ON INPUT
	CONO	IMP,MPESET
	POPJ	P,


	$LIT
	$LOW

;STORAGE

BLKIPT:	0		;BLKI POINTER
INPON:	0		;-1 IF INPUT SHOULD BE ACTIVE
DUMMY:	0		;PLACE TO PUT DISCARDED INPUT DATA

BLKOPT:	0		;BLKO POINTER
OUTACT:	0		;-1 IF OUTPUT IS ACTIVE

	END